package rpc

import (
	"fmt"
	"google.golang.org/grpc"
	"grpc_tapd_s/proto"
	"grpc_tapd_s/service"
	"io"
	"net"
	"os"
)

type server struct {
	proto.UnimplementedExportServer
}

// ExportTap 根据客户端发送的消息先生成文档,从指定文件夹读取文件
//流式读取然后一点点发送给客户端,客户端接收,直到服务端发送完毕,关闭服务
func (s *server) ExportTap(in *proto.ExportRequest, stream proto.Export_ExportTapServer) error {
	fileName := fmt.Sprintf("./doc/%s.xlsx", in.FileName)
	//获取传参,生成文档
	service.ExportXlsx(in.Begin, in.End, in.LastBegin, in.LastEnd, fileName)
	//向客户端发送文档
	// 只读方式打开当前目录下的main.go文件
	file, err := os.Open(fileName)
	if err != nil {
		fmt.Println("open file failed!, err:", err)
		return nil
	}
	defer file.Close()
	// 循环读取文件
	var tmp = make([]byte, 128)
	for {
		n, err := file.Read(tmp)
		if err == io.EOF {
			fmt.Println("文件读完了")
			break
		}
		if err != nil {
			fmt.Println("read file failed, err:", err)
			return err
		}
		data := &proto.ExportResponse{
			One: tmp[:n],
		}
		// 使用Send方法返回多个数据
		if err := stream.Send(data); err != nil {
			return err
		}
	}
	return nil
}

func InitRpc() {
	// 监听本地的8972端口
	lis, err := net.Listen("tcp", ":8972")
	if err != nil {
		fmt.Printf("failed to listen: %v", err)
		return
	}
	s := grpc.NewServer()                    // 创建gRPC服务器
	proto.RegisterExportServer(s, &server{}) // 在gRPC服务端注册服务
	// 启动服务
	err = s.Serve(lis)
	if err != nil {
		fmt.Printf("failed to serve: %v", err)
		return
	}
	fmt.Println("server starting...")
}
